package cn.edu.hnu.gpg.service;

import cn.edu.hnu.gpg.dto.Account;
import cn.edu.hnu.gpg.dto.AccountSearchTerm;
import cn.edu.hnu.gpg.entity.Student;
import cn.edu.hnu.gpg.entity.StudentExample;
import cn.edu.hnu.gpg.entity.enums.Gender;

import java.util.Date;
import java.util.List;

public interface StudentService {

    /**
     *通过用户索引来查找对应的学生对象
     * @param user_id 学生对应的用户id
     * @return 获得得学生对象
     */
    Student findStudentByUserId(int user_id);

    List<Student> findStudentLike(Student student);

    List<Account> findStudentAccountLike(Student student, boolean onlyActiveAccount);

    List<Student> findStudentByStudentId(List<Integer> studentIdList);

    /**
     * 通过学生的ID来查找对应的学生对象
     * @param student_id 学生的学生ID
     * @return 获得得学生对象
     */
    Student findStudentByStudentId(int student_id);

    /**
     *用于新建学生（预计流程为，先新建类型为S类型用户，然后在使用该user_id创建学生，从而确保外键约束）
     * @param user_id 用户id(当向学生表插入数据的时候，需要先创建用户，再创建学生信息)
     * @param student_number 学号
     * @param id_number 学生的身份证号
     * @param name 学生的姓名
     * @param gender 学生的性别
     * @param birth_date 学生的出生日期
     * @param phone 学生的电话号码
     * @param department_id 学生所属的学院编号
     * @param enrollment_year 入学年份
     * @return 新建学生的student_id,创建失败时返回0
     */
    int createStudent(int user_id, String student_number, String id_number, String name, Gender gender, Date birth_date, String phone,
                      short department_id,short enrollment_year);

    /**
     *创建新的学生的同时将其做为user注册
     * @param student_number 学号
     * @param id_number 学生的身份证号
     * @param name 学生的姓名
     * @param gender 学生的性别
     * @param birth_date 学生的出生日期
     * @param phone 学生的电话号码
     * @param department_id 学生所属的学院编号
     * @param enrollment_year 入学年份
     * @return 新建学生的student_id,创建失败时返回0
     */
    int createStudentAccount(String student_number,String id_number,String name,Gender gender,Date birth_date,String phone,
                             short department_id,short enrollment_year);
    int createStudentAccount(Student student);

    /**
     * 更改学生的个人信息（设计：修改信息时，必定是对某个表单进行修改，当修改完某一数据时，会将表单所有信息提交，因此只需要重设一遍
     * 学生对象中的各个属性即可实现update的功能）
     * @param user_id 用户id
     * @param student_number 学号
     * @param id_number 学生的身份证号
     * @param name 学生的姓名
     * @param gender 学生的性别
     * @param birth_date 学生的出生日期
     * @param phone 学生的电话号码
     * @param department_id 学生所属的学院编号
     * @param enrollment_year 入学年份
     * @return 是否更改成功
     */
    boolean updateInfo(int user_id,String student_number,String id_number,String name,Gender gender,Date birth_date,String phone,
                       short department_id,short enrollment_year);

    boolean updateStudentByStudentNumber(Student student, boolean skipNull);
}
